home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / wgdb-42.lha / wgdb-4.2 / include / h8300-opcode.h < prev    next >
C/C++ Source or Header  |  1992-09-11  |  11KB  |  234 lines

  1. /* Opcode table for the H8-300
  2.    Copyright (C) 1989, 1991 Free Software Foundation.
  3.    Written by Steve Chamberlain, steve@cygnus.com.
  4.  
  5. This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler.
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.  
  21. typedef enum op_type
  22.   {
  23. Hex0=0,
  24. Hex1,Hex2,Hex3,Hex4,Hex5,Hex6,Hex7,Hex8,Hex9,HexA,HexB,HexC,HexD,HexE,HexF,
  25.     START = 0x20,
  26.     KBIT,                /* K is #1, or #2, yielding 0x0 or 0x8 */
  27.     IMM3,                /* bit number */
  28.     RD8,                /* 8 bit reg as 2nd op  */
  29.     RD16,                /* 16 bit reg as 2nd op */
  30.     RS8,                /* 8 bit reg as 1st op */
  31.     RS16,                /* 16 bit reg 1st op */
  32.     IMM8,                /* constant which fits into 8 bits */
  33.     IMM16,            /* constant which fits into 16 bits */
  34.     CCR,                /* CCR reg */
  35.     ABS8SRC,            /* abs 8 address mode */
  36.     ABS8DST,            /* abs 8 address mode */
  37.     DISP8,            /* pc rel displacement */
  38.     ABS16SRC,            /* abs 16 address mode */
  39.     ABS16DST,            /* abs 16 address mode */
  40.     DISPSRC,            /* @(r:16) address mode src */
  41.     DISPDST,            /* @(r:16) address mode dst*/
  42.     DISPREG,            /* register from DISP address mode */
  43.     RDDEC,            /* @-rn mode */
  44.     RSINC,            /* @rn+ mode */
  45.     RDIND,            /* @R mode dst */
  46.     RSIND,            /* @R mode src */
  47.     MEMIND,            /* @@r8 mode */
  48.     IGNORE,
  49.     B30 = 0x40,            /* bit 3 must be low */
  50.     B31 = 0x80,            /* bit 3 must be high */
  51.  
  52.   E                /* End of list */
  53.   } op_type;
  54.  
  55.  
  56. struct code {
  57.  
  58.   op_type nib[9];
  59. } ;
  60.  
  61. struct h8_opcode {
  62.   int length;
  63.   int noperands;    /* Number of operands this opcode takes */
  64.   int nopcodes;        /* Number of opcodes with same mnemonic */
  65.   char *name;
  66.   struct code args;
  67.   struct code data;
  68. int value;
  69. };
  70.  
  71.  
  72.  
  73. struct h8_opcode h8_opcodes[] 
  74. #ifdef DEFINE_TABLE
  75.  
  76. #define BITOP(n,imm, name, op00, op01,op10,op11, op20,op21)\
  77. {  2,  2,n, name,    {imm,RD8,E},    {op00, op01, imm, RD8,E}},\
  78. { 4,   2,n, name,    {imm,RDIND,E},    {op10, op11, RDIND, 0, op00,op01, imm, 0,E}},\
  79. { 4,   2,n, name,    {imm,ABS8DST,E},    {op20, op21, ABS8DST, IGNORE, op00,op01, imm, 0,E}}
  80.  
  81. #define EBITOP(n,imm, name, op00, op01,op10,op11, op20,op21)\
  82.    BITOP(n,imm, name, op00+1, op01, op10,op11, op20,op21),\
  83.    BITOP(n, RS8,  name, op00, op01, op10,op11, op20,op21)
  84.  
  85. #define BRANCH(name, op) \
  86. {   2,  1, 1,name,{DISP8,E}, { Hex4, op, DISP8,IGNORE,E }}
  87.  
  88. #define TWOOP(name, op1, op2,op3) \
  89. { 2,  2, 2, name, {IMM8, RD8,E},    { op1, RD8, IMM8,IGNORE,E}},\
  90. { 2,  2, 2, name, {RS8, RD8, E},    { op2, op3, RS8, RD8 ,E}} 
  91.  
  92. #define UNOP(name, op1, op2) \
  93. { 2, 1, 1, name, {RS8, E}, { op1, op2, 0, RS8, E}}
  94.  
  95. #define UNOP3(name, op1, op2, op3) \
  96. {2, 1, 1, name , {RS8, E}, {op1, op2, op3, RS8, E}}
  97.  
  98. #define WTWOP(name, op1, op2) \
  99. {2, 2, 1, name, {RS16, RD16, E}, { op1, op2, RS16, RD16, E}}
  100.  
  101. {
  102.   TWOOP("add.b", Hex8,    Hex0,Hex8),
  103.   WTWOP("add.w", Hex0, Hex9),
  104.     { 2,  2, 1, "adds", {KBIT,RD16|B30, E},{Hex0, HexB, KBIT, RD16|B30, E}},
  105.   TWOOP("addx", Hex9,Hex0,HexE),
  106.   TWOOP("and", HexE,Hex1,Hex6),
  107.     {  2,  2, 1, "andc",    {IMM8, CCR, E},    { Hex0, Hex6, IMM8,IGNORE, E}},
  108.   BITOP(3,IMM3|B30, "band", Hex7, Hex6, Hex7, HexC,  Hex7, HexE),
  109.   BRANCH("bra",    Hex0),
  110.   BRANCH("bt",    Hex0),
  111.   BRANCH("brn",    Hex1),
  112.   BRANCH("bf",    Hex1),
  113.   BRANCH("bhi",    Hex2),
  114.   BRANCH("bls",    Hex3),
  115.   BRANCH("bcc",    Hex4),
  116.   BRANCH("bhs",    Hex4),
  117.   BRANCH("bcs",    Hex5),
  118.   BRANCH("blo",    Hex5),
  119.   BRANCH("bne",    Hex6),
  120.   BRANCH("beq",    Hex7),
  121.   BRANCH("bvc",    Hex8),
  122.   BRANCH("bvs",    Hex9),
  123.   BRANCH("bpl",    HexA),
  124.   BRANCH("bmi",    HexB),
  125.   BRANCH("bge",    HexC),
  126.   BRANCH("blt",    HexD),
  127.   BRANCH("bgt",    HexE),
  128.   BRANCH("ble",    HexF),
  129.   EBITOP(6,IMM3|B30,"bclr", Hex6, Hex2, Hex7, HexD, Hex7, HexF),
  130.   BITOP(3,IMM3|B31,"biand", Hex7, Hex6, Hex7, HexC, Hex7, HexE),
  131.   BITOP(3,IMM3|B31, "bild",    Hex7, Hex7,Hex7, HexC, Hex7, HexE),
  132.   BITOP(3,IMM3|B31, "bior",    Hex7, Hex4,Hex7, HexC, Hex7, HexE),
  133.   BITOP(3,IMM3|B31, "bist",    Hex6, Hex7,Hex7, HexD, Hex7, HexE),
  134.   BITOP(3,IMM3|B31, "bixor",    Hex7, Hex5,Hex7, HexC, Hex7, HexE),
  135.   BITOP(3,IMM3|B30, "bld",    Hex7, Hex7,Hex7, HexC, Hex7, HexE),
  136.   EBITOP(6,IMM3|B30,"bnot", Hex6, Hex1, Hex7, HexD, Hex7, HexF),
  137.   BITOP(3,IMM3|B30,"bor",    Hex7, Hex4,Hex7, HexC, Hex7, HexE),
  138.   EBITOP(6,IMM3|B30,"bset",    Hex6, Hex0,Hex7, HexD, Hex7, HexF),
  139.     {  2,  1, 1, "bsr",{DISP8, E},{ Hex5, Hex5, DISP8,IGNORE, E}},
  140.   BITOP(3,IMM3|B30, "bst",    Hex6, Hex7,Hex7, HexD, Hex7, HexF),
  141.   EBITOP(6,IMM3|B30, "btst",    Hex6, Hex3,Hex7, HexC, Hex7, HexE),
  142.   BITOP(3,IMM3|B30, "bxor",    Hex7,Hex5,Hex7, HexC, Hex7, HexE),
  143.   TWOOP( "cmp.b",HexA, Hex1, HexC),
  144.   WTWOP( "cmp.w",Hex1,HexD),
  145.   UNOP(   "daa",Hex0, HexF),
  146.   UNOP(   "das",Hex1, HexF),
  147.   UNOP(   "dec",Hex1, HexA),
  148.     {  2,  2, 1, "divxu",{RS8, RD16|B30, E}, { Hex5, Hex1, RS8, RD16|B30, E}},
  149.     {  4,  0, 1, "eepmov",{ E}, {Hex7, HexB, Hex5, HexC, Hex5, Hex9, Hex8, HexF,E}},
  150.   UNOP(   "inc",    Hex0, HexA),
  151.     {  2,  1, 3, "jmp",{RSIND|B30, E}, {Hex5, Hex9, RSIND|B30, Hex0, E}},
  152.     {  4,  1, 3, "jmp",{ABS16SRC, E}, {Hex5, HexA, Hex0, Hex0, ABS16SRC, IGNORE,IGNORE,IGNORE,E}},
  153.     {  2,  1, 3, "jmp",{MEMIND, E}, {Hex5, HexB, MEMIND,IGNORE, E}},
  154.     {  2,  1, 3, "jsr",{RSIND|B30, E}, {Hex5, HexD, RSIND|B30, Hex0, E}},
  155.     {  4,  1, 3, "jsr",{ABS16SRC, E}, {Hex5, HexE, Hex0, Hex0, ABS16SRC,IGNORE,IGNORE,IGNORE, E}},
  156.     {  2,  1, 3, "jsr",{MEMIND, E}, {Hex5, HexF, MEMIND, IGNORE,E}},
  157.     {  2,  2, 2, "ldc",    {IMM8, CCR, E}, { Hex0, Hex7, IMM8,IGNORE, E}},
  158.     {  2,  2, 2, "ldc",    {RS8, CCR, E},    { Hex0, Hex3, Hex0, RS8, E}},
  159.  
  160.     {  2,  2,13,  "mov.b",    {RS8, RD8, E},    { Hex0, HexC, RS8, RD8, E}},
  161.     {  2,  2,13,  "mov.b",    {IMM8, RD8, E},    { HexF, RD8, IMM8,IGNORE, E}},
  162.     {  2,  2,13,  "mov.b",    {RSIND|B30,RD8, E},    { Hex6, Hex8, RSIND|B30, RD8, E}},
  163.     {  4,  2,13,  "mov.b",    {DISPSRC,RD8, E},    { Hex6, HexE, DISPREG|B30, RD8, DISPSRC, IGNORE, IGNORE, IGNORE, E}} ,
  164.     {  2,  2,13,  "mov.b",    {RSINC|B30, RD8, E},    { Hex6, HexC, RSINC|B30, RD8, E}},
  165.  
  166.     {  4,  2,13,  "mov.b",    {ABS16SRC, RD8, E},    { Hex6, HexA, Hex0, RD8,ABS16SRC, IGNORE,IGNORE,IGNORE,E}},
  167.     {  2,  2,13,  "mov.b",    {ABS8SRC, RD8, E},    { Hex2, RD8, ABS8SRC,IGNORE, E}},
  168.     {  2,  2,13,  "mov.b",     {RS8, RDIND|B30, E},    { Hex6, Hex8, RDIND|B31, RS8, E}},
  169.     {  4,  2,13,  "mov.b",    {RS8, DISPDST, E},    { Hex6, HexE, DISPREG|B31, RS8,DISPDST, IGNORE, IGNORE, IGNORE, E}},
  170.     {  2,  2,13,  "mov.b",    {RS8, RDDEC|B31, E},    { Hex6, HexC, RDDEC|B31, RS8, E}},
  171. /* Put the 16 bit one in first so it matches first */
  172.     {  4,  2,13,  "mov.b",    {RS8, ABS16DST, E},    { Hex6, HexA, Hex8, RS8, ABS16DST,IGNORE,IGNORE,IGNORE, E}},
  173.     {  2,  2,13,  "mov.b",    {RS8, ABS8DST, E},    { Hex3, RS8, ABS8DST,IGNORE, E}},
  174.     {  2,  2,11,  "mov.w",    {RS16|B30, RD16|B30, E},{ Hex0, HexD, RS16|B30, RD16|B30, E}},
  175.     {  4,  2,11,  "mov.w",    {IMM16, RD16|B30, E},    { Hex7, Hex9, Hex0, RD16|B30, IMM16,IGNORE,IGNORE,IGNORE, E}},
  176.     {  2,  2,11,  "mov.w",    {RSIND|B30,RD16|B30, E},{ Hex6, Hex9, RSIND|B30, RD16|B30, E}},
  177.     {  4,  2,11,  "mov.w",    {DISPSRC,RD16|B30, E},    { Hex6, HexF, DISPREG|B30, RD16|B30, DISPSRC, IGNORE, IGNORE, IGNORE,E}} ,
  178.     {  2,  2,11,  "mov.w",    {RSINC|B30, RD16|B30, E},    { Hex6, HexD, RSINC|B30, RD16|B30, E}},
  179.     {  4,  2,11,  "mov.w",    {ABS16SRC, RD16|B30, E},    { Hex6, HexB, Hex0, RD16|B30,ABS16SRC,IGNORE,IGNORE,IGNORE, E}},
  180.     {  2,  2,11,  "mov.w",     {RS16|B30, RDIND|B30, E},{ Hex6, Hex9, RDIND|B31, RS16|B30, E}},
  181.     {  4,  2,11,  "mov.w",    {RS16|B30, DISPDST, E},    { Hex6, HexF, DISPREG|B31, RS16|B30,DISPDST, IGNORE,IGNORE,IGNORE,E}},
  182.     {  2,  2,11,  "mov.w",    {RS16|B30, RDDEC|B30, E},{ Hex6, HexD, RDDEC|B31, RS16|B30, E}},
  183.     {  4,  2,11,  "mov.w",    {RS16|B30, ABS16DST, E},    { Hex6, HexB, Hex8, RS16|B30, ABS16DST, IGNORE, IGNORE, IGNORE, E}},
  184.  
  185.  
  186.     {  4,  2,1,  "movfpe",    {ABS16SRC, RD8, E},    { Hex6, HexA, Hex4, RD8, ABS16SRC,IGNORE,IGNORE,IGNORE, E}},
  187.     {  4,  2,1,  "movtpe",    {RS8, ABS16DST, E},    { Hex6, HexA, HexC, RS8, ABS16DST,IGNORE,IGNORE,IGNORE, E}},
  188.     {  2,  2,1,  "mulxu",    {RS8, RD16|B30, E},    { Hex5, Hex0, RS8, RD16|B30, E}},
  189.     {  2,  1,1,  "neg",    {RS8, E},        { Hex1, Hex7, Hex8, RS8, E}},
  190.     {  2,  0,1,  "nop",    {E},        { Hex0, Hex0, Hex0, Hex0,E}},
  191.     {  2,  1,1,  "not",    {RS8,E},        { Hex1, Hex7, Hex0, RS8,E}},
  192.   TWOOP("or", HexC, Hex1, Hex4),
  193.     {  2,  2,1,    "orc",    {IMM8, CCR,E},    { Hex0, Hex4, IMM8,IGNORE,E}},
  194.     {  2,  1,1,  "pop",    {RS16|B30,E},        { Hex6, HexD, Hex7, RS16|B30,E}},
  195.     {  2,  1,1,  "push",    {RS16|B30,E},        { Hex6, HexD, HexF, RS16|B30,E}},
  196.   UNOP3(  "rotl",Hex1, Hex2,Hex8),
  197.   UNOP3(  "rotr",Hex1, Hex3, Hex8),
  198.   UNOP3(  "rotxl",Hex1, Hex2, Hex0),
  199.   UNOP3(  "rotxr",Hex1, Hex3, Hex0),
  200.     {  2,  0, 1, "rte",    {E},        { Hex5, Hex6, Hex7, Hex0,E}},
  201.     {  2,  0, 1, "rts",    {E},        { Hex5, Hex4, Hex7, Hex0,E}},
  202.   UNOP3(   "shal",    Hex1, Hex0, Hex8),
  203.   UNOP3(    "shar",    Hex1, Hex1, Hex8),
  204.   UNOP3(    "shll",    Hex1, Hex0, Hex0),
  205.   UNOP3(    "shlr",    Hex1, Hex1, Hex0),
  206.     {  2,  0, 1, "sleep",    {E},        { Hex0, Hex1, Hex8, Hex0,E}},
  207.     {  2,  2, 1, "stc",    {CCR, RD8,E},    { Hex0, Hex2, Hex0, RD8,E}},
  208.     {  2,  2, 1, "sub.b",    {RS8,RD8,E},    { Hex1, Hex8, RS8, RD8,E}},
  209.     {  2,  2, 1, "sub.w",    {RS16|B30, RD16|B30,E},     {Hex1, Hex9, RS16|B30, RD16|B30,E}},
  210.     {  2,  2, 1, "subs",    {KBIT,RD16|B30,E},    { Hex1, HexB, KBIT, RD16|B30,E}},
  211.   TWOOP("subx",HexB, Hex1, HexE),
  212.   TWOOP("xor", HexD, Hex1, Hex5), 
  213.     {  2,  2,  1,"xorc",    {IMM8, CCR,E}, { Hex0, Hex5, IMM8,IGNORE,E}},
  214.     {  2,  0,1,  "bad 52",    {E, IMM8},        { Hex5, Hex2, IMM8, IGNORE,E}},
  215.     {  2,  0,1,  "bad 53",    {E, IMM8},        { Hex5, Hex3, IMM8, IGNORE,E}},
  216.     {  2,  0,1,  "bad 57",    {E, IMM8},        { Hex5, Hex7, IMM8, IGNORE,E}},
  217.     {  2,  0,1,  "bad 58",    {E, IMM8},        { Hex5, Hex8, IMM8, IGNORE,E}},
  218.     {  2,  0,1,  "bad 64",    {E, IMM8},        { Hex6, Hex4, IMM8, IGNORE,E}},
  219.     {  2,  0,1,  "bad 65",    {E, IMM8},        { Hex6, Hex5, IMM8, IGNORE,E}},
  220.     {  2,  0,1,  "bad 66",    {E, IMM8},        { Hex6, Hex6, IMM8, IGNORE,E}},
  221.     {  2,  0,1,  "bad 78",    {E, IMM8},        { Hex7, Hex8, IMM8, IGNORE,E}},
  222.     {  2,  0,1,  "bad 7a",    {E, IMM8},        { Hex7, HexA, IMM8, IGNORE,E}},
  223.     {  2,  0,1,  "bad 5c",    {E, IMM8},        { Hex5, HexC, IMM8, IGNORE,E}},
  224.  
  225.   0
  226.   }
  227.  
  228.  
  229.  
  230. #endif
  231.  
  232. ;
  233.